package online.inote.dic.common.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * Desc: 
 * </p>
 *
 * @author XQF SUI
 * @created 2018年11月14日 下午4:44:14
 * @version 1.0
 */
public class DateTimeUtils {
	
	private static Logger logger = LoggerFactory.getLogger(DateTimeUtils.class);

	 // 时间短格式
    public static final String TIME_FORMAT_SHORT = "yyyyMMddHHmmss";
    // 时间默认格式
    public static final String TIME_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss";
    // 英文格式时间
    public static final String TIME_FORMAT_ENGLISH = "MM/dd/yyyy HH:mm:ss";
    // 中国格式时间
    public static final String TIME_FORMAT_CHINA = "yyyy年MM月dd日 HH时mm分ss秒";
    // 中国格式短时间
    public static final String TIME_FORMAT_CHINA_S = "yyyy年M月d日 H时m分s秒";
    
    public static final String TIME_FORMAT_LONG_E = "yyyy-MM-dd HH:mm:ss E";
    
    public static final String TIME_FORMAT_LONG_S = "yyyy-MM-dd HH:mm:ss.SSS";
    // 日期短格式
    public static final String DATE_FORMAT_SHORT = "yyyyMMdd";
    // 年月格式
    public static final String DATE_FORMAT_YEAR_MONTH = "yyyy-MM";
    // 年月短格式
    public static final String DATE_FORMAT_YEAR_MONTH_SHORT = "yyyyMM";
    // 日期默认格式
    public static final String DATE_FORMAT_NORMAL = "yyyy-MM-dd";
    // 英文格式日期
    public static final String DATE_FORMAT_ENGLISH = "MM/dd/yyyy";
    // 中国格式日期
    public static final String DATE_FORMAT_CHINA = "yyyy年MM月dd日";
    
    public static final String CHINA_YEAR_MONTH_DAY_HOUR_MINUTE_S = "yyyy年MM月dd日 HH:mm";
    
    public static final String MONTH_DAY_FORMAT = "MM-dd";
    
    public static final String DATE_FORMAT_MINUTE = "yyyyMMddHHmm";
    
    public static final long SECOND = 1000L;
    
    public static final long MINUTE = 60L * SECOND;
    
    public static final long HOUR = 60L * MINUTE;
    
    public static final long DAY = 24L * HOUR;
    
    public static final long DAY_TO_SECOND = 24L * HOUR / 1000;
    
    /**
     * <p>
     * Desc: 获取当前时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午4:48:13
     * @return
     */
    public static Date getNow() {
    	return new Date();
    }
    
    /**
     * <p>
     * Desc: 获取指定时间之后的时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午4:57:48
     * @param date
     * @param field
     * @param offset
     * @return
     */
    public static Date getAfter(Date date, int field, int offset) {
    	Calendar calendar = Calendar.getInstance(Locale.CHINA);
    	calendar.setTime(date);
    	calendar.add(field, offset);
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取指定小时后的时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:02:17
     * @param date
     * @param offset
     * @return
     */
    public static Date getAfterHour(Date date, int offset) {
    	return getAfter(date, Calendar.HOUR, offset);
    }
    
    /**
     * <p>
     * Desc: 获取指定天数后的时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:00:02
     * @param date
     * @param offset
     * @return
     */
    public static Date getAfterDay(Date date, int offset) {
    	return getAfter(date, Calendar.DATE, offset);
    }
    
    /**
     * <p>
     * Desc: 获取指定月后的时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:34:46
     * @param date
     * @param offset
     * @return
     */
    public static Date getAfterMonth(Date date, int offset) {
    	return getAfter(date, Calendar.MONTH, offset);
    }
    
    /**
     * <p>
     * Desc: 获取指定年后的时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:35:43
     * @param date
     * @param offset
     * @return
     */
    public static Date getAfterYear(Date date, int offset) {
    	return getAfter(date, Calendar.YEAR, offset);
    }
    
    /**
     * <p>
     * Desc: 获取一天的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:05:18
     * @param date
     * @return
     */
    public static Date getDayLastTime(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取一天的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:07:03
     * @param date
     * @return
     */
    public static Date getDayFirstTime(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取指定日期的周一时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:25:14
     * @param date
     * @return
     */
    public static Date getWeekFirstDate(Date date) {
    	Calendar calendar = Calendar.getInstance(Locale.CHINA);
        
    	calendar.setTime(date);
    	calendar.setFirstDayOfWeek(Calendar.MONDAY);
    	calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
    	
    	return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取指定周的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:29:43
     * @param date
     * @return
     */
    public static Date getWeekLastDate(Date date) {
    	Calendar calendar = Calendar.getInstance(Locale.CHINA);
        
    	calendar.setTime(date);
    	calendar.setFirstDayOfWeek(Calendar.MONDAY);
    	calendar.set(Calendar.DAY_OF_WEEK, calendar.getActualMaximum(Calendar.DAY_OF_WEEK) + 1);
    	
    	return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取指定时间的周一开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:23:54
     * @param date
     * @return
     */
    public static Date getWeekFirstTime(Date date) {
    	Calendar calendar = Calendar.getInstance(Locale.CHINA);
        
    	calendar.setTime(date);
    	calendar.setFirstDayOfWeek(Calendar.MONDAY);
    	calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
    	
    	return getDayFirstTime(calendar.getTime());
    }
    
    /**
     * <p>
     * Desc: 获取指定周的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:31:09
     * @param date
     * @return
     */
    public static Date getWeekLastTime(Date date) {
    	return getDayLastTime(getWeekLastDate(date));
    }
    
    /**
     * <p>
     * Desc: 获取月份第一天时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:12:42
     * @param date
     * @return
     */
    public static Date getMonthFirstDate(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取指定月份的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:22:16
     * @param date
     * @return
     */
    public static Date getMonthLastDate(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取月份的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午5:17:42
     * @param date
     * @return
     */
    public static Date getMonthFirstTime(Date date) {
        return getDayFirstTime(getMonthFirstDate(date));
    }
    
    /**
     * <p>
     * Desc: 获取指定月份的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午6:23:23
     * @param date
     * @return
     */
    public static Date getMonthLastTime(Date date) {
    	return getDayLastTime(getMonthLastDate(date));
    }
    
    /**
     * <p>
     * Desc: 获取指定年份的第一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:14:49
     * @param date
     * @return
     */
    public static Date getYearFirstDate(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DAY_OF_YEAR, 1);
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取一年的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:16:42
     * @param date
     * @return
     */
    public static Date getYearLastDate(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DAY_OF_YEAR, calendar.getActualMaximum(Calendar.DAY_OF_YEAR));
        return calendar.getTime();
    }
    
    /**
     * <p>
     * Desc: 获取一年的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:19:37
     * @param date
     * @return
     */
    public static Date getYearFirstTime(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DAY_OF_YEAR, 1);
        return getDayFirstTime(calendar.getTime());
    }
    
    /**
     * <p>
     * Desc: 获取一年的结束时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:19:54
     * @param date
     * @return
     */
    public static Date getYearLastTime(Date date) {
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.set(Calendar.DAY_OF_YEAR, calendar.getActualMaximum(Calendar.DAY_OF_YEAR));
        return getDayLastTime(calendar.getTime());
    }
    
    /**
     * <p>
     * Desc: 是否是一天的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:01:46
     * @param date
     * @return
     */
    public static boolean isDayFirstTime(Date date) {
    	return getDayFirstTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一天的最后时间 
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:00:06
     * @param date
     * @return
     */
    public static boolean isDayLastTime(Date date) {
    	return getDayLastTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一周的第一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:03:33
     * @param date
     * @return
     */
    public static boolean isWeekFirstDate(Date date) {
    	return getWeekFirstDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一周的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:02:37
     * @param date
     * @return
     */
    public static boolean isWeekLastDate(Date date) {
    	return getWeekLastDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一周的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:05:18
     * @param date
     * @return
     */
    public static boolean isWeekFirstTime(Date date) {
    	return getWeekFirstTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一周的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:04:23
     * @param date
     * @return
     */
    public static boolean isWeekLastTime(Date date) {
    	return getWeekLastTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是本周时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月15日 下午4:52:03
     * @param date
     * @return
     * @throws ParseException
     */
    public static boolean isThisWeek(Date date) throws ParseException {
    	
    	Date startTime = getWeekFirstTime(getNow()); 	// 本周开始时间
    	Date endTime = getWeekLastTime(getNow());		// 本周结束时间
    	
		if ((startTime.before(date) || startTime.equals(date)) && (endTime.after(date) || endTime.equals(date))) {
			return true;
		}
    	
    	return false;
    }
    
    /**
     * <p>
     * Desc: 是否是今天时间
     * </p>
     *
     * @author huijiangzhang
     * @created 2018年11月27日下午5:40:18
     * @param date
     * @return
     * @throws ParseException
     * boolean
     */
    public static boolean isToday(Date date) throws ParseException {
    	
    	Date startTime = getDayFirstTime(getNow()); 	// 今天开始时间
    	Date checkStartTime = getDayFirstTime(date);	// 检测时间当天开始时间
    	
		if (startTime.equals(checkStartTime)) {
			return true;
		}
    	
    	return false;
    }
    
    /**
     * <p>
     * Desc: 是否是当月的第一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:07:25
     * @param date
     * @return
     */
    public static boolean isMonthFirstDate(Date date) {
    	return getMonthFirstDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是当月的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:06:11
     * @param date
     * @return
     */
    public static boolean isMonthLastDate(Date date) {
    	return getMonthLastDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是当月的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:09:11
     * @param date
     * @return
     */
    public static boolean isMonthFirstTime(Date date) {
    	return getMonthFirstTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是当月的最后时间 
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:08:21
     * @param date
     * @return
     */
    public static boolean isMonthLastTime(Date date) {
    	return getMonthLastTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一年的第一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:21:00
     * @param date
     * @return
     */
    public static boolean isYearFirstDate(Date date) {
    	return getYearFirstDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一年的最后一天
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:22:09
     * @param date
     * @return
     */
    public static boolean isYearLastDate(Date date) {
    	return getYearLastDate(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一年的开始时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:23:05
     * @param date
     * @return
     */
    public static boolean isYearFirstTime(Date date) {
    	return getYearFirstTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc: 是否是一年的最后时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月14日 下午7:24:17
     * @param date
     * @return
     */
    public static boolean isYearLastTime(Date date) {
    	return getYearLastTime(date).equals(date);
    }
    
    /**
     * <p>
     * Desc:初始化时间格式
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午10:56:00
     * @param formatStr 时间格式字符串
     * @return DateFormat
     */
    public static DateFormat initDateFormat(String formatStr) {
        return new SimpleDateFormat(formatStr);
    }
    
    /**
     * <p>
     * Desc: 将时间格式化为指定格式字符串
     * </p>
     * @author XQF SUI
     * @created 2017年9月27日 下午7:51:09
     * @param date
     * @param fomat
     * @return
     */
    public static String getCustomizedFomatString(Date date, String fomat) {
    	return initDateFormat(fomat).format(date);
    }
    
    /**
     * <p>
     * Desc:根据时间获取yyyyMMddHHmmss格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午11:40:33
     * @param date
     * @return
     */
    public static String getTimeShortString(Date date) {
        return initDateFormat(TIME_FORMAT_SHORT).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间 yyyyMMddHHmmss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午11:49:31
     * @return
     */
    public static String getNowTimeShortString() {
        return getTimeShortString(getNow());
    }
    
    /**
	 * <p>
	 * Desc:获取现在日期 yyyyMMdd 字符串
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created: 2016年4月2日 下午10:45:09
	 * @return 格式化后的时间字符串
	 */
	public static String getNowDateShortString() {
		return getDateShortString(getNow());
	}
	
	/**
	 * <p>
	 * Desc: 根据时间获取 yyyyMMdd 日期字符串
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created: 2016年4月2日 下午10:41:37
	 * @param date
	 *            时间
	 * @return 格式化后的时间字符串
	 */
	public static String getDateShortString(Date date) {
		return initDateFormat(DATE_FORMAT_SHORT).format(date);
	}
    
    /**
     * <p>
     * Desc:根据时间获取 yyyy-MM-dd HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午11:52:52
     * @param date
     * @return
     */
    public static String getTimeNormalString(Date date) {
        return initDateFormat(TIME_FORMAT_NORMAL).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间 yyyy-MM-dd HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午11:54:28
     * @return
     */
    public static String getNowTimeNormalString() {
        return getTimeNormalString(getNow());
    }
    
    /**
     * <p>
     * Desc:根据时间获取 MM/dd/yyyy HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月2日 下午11:58:41
     * @param date
     * @return
     */
    public static String getTimeEngLishString(Date date) {
        return initDateFormat(TIME_FORMAT_ENGLISH).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间 MM/dd/yyyy HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:00:27
     * @return
     */
    public static String getNowTimeEngLishString() {
        return getTimeEngLishString(getNow());
    }
    
    /**
     * <p>
     * Desc: 根据时间获取 yyyy年MM月dd日 HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:03:59
     * @return
     */
    public static String getTimeChinaString(Date date) {
        return initDateFormat(TIME_FORMAT_CHINA).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间  yyyy年MM月dd日 HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:06:02
     * @return
     */
    public static String getNowTimeChinaString() {
        return getTimeChinaString(getNow());
    }
    
    /**
     * <p>
     * Desc: 根据时间获取 yyyy年MM月dd日 HH时mm分ss秒 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:07:59
     * @return
     */
    public static String getTimeChinaSString(Date date) {
        return initDateFormat(TIME_FORMAT_CHINA_S).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间  yyyy年MM月dd日 HH:mm:ss 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:09:02
     * @return
     */
    public static String getNowTimeChinaSString() {
        return getTimeChinaSString(getNow());
    }
    
    /**
     * <p>
     * Desc:根据时间获取 yyyy-MM-dd HH:mm:ss E 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午10:34:53
     * @param date
     * @return
     */
    public static String getTimeLongString(Date date) {
        return initDateFormat(TIME_FORMAT_LONG_E).format(date);
    }
    
    /**
     * <p>
     * Desc:获取现在时间 yyyy-MM-dd HH:mm:ss E 格式字符串
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午10:36:06
     * @return
     */
    public static String getNowTimeLongString() {
        return initDateFormat(TIME_FORMAT_LONG_E).format(getNow());
    }
    
    /**
     * <p>
     * Desc:获取两个时间之间相差的天数
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午12:17:44
     * @param dateBegin
     * @param dataEnd
     * @return
     */
    public static Long getIntervalDay(Date startTime, Date endTime) {
        return (endTime.getTime() - startTime.getTime()) / DAY;
    }
    
    /**
     * <p>
     * Desc:获取两个时间之间相差的小时数
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午10:20:35
     * @param dateBegin
     * @param dataEnd
     * @return
     */
    public static Long getIntervalHour(Date startTime, Date endTime) {
        return (Long) ((endTime.getTime() - startTime.getTime()) / HOUR);
    }
    
    /**
     * <p>
     * Desc:获取两个时间之间相差的分钟数
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午10:20:55
     * @param dateBegin
     * @param dataEnd
     * @return
     */
    public static Long getIntervalMinute(Date startTime, Date endTime) {
        return (Long) ((endTime.getTime() - startTime.getTime()) / MINUTE);
    }
    
    /**
     * <p>
     * Desc:获取两个时间之间相差的秒数
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 上午10:21:15
     * @param dateBegin
     * @param dataEnd
     * @return
     */
    public static Long getIntervalSecond(Date startTime, Date endTime) {
        return (Long) ((endTime.getTime() - startTime.getTime()) / SECOND);
    }
    
    /**
     * <p>
     * Desc:输入的日期是否为时间格式
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 下午6:46:35
     * @param input
     * @return
     */
    public static boolean isInputDate(String input) {
    	try {
			convertToDate(input);
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * <p>
     * Desc: 获取指定月份的天数
     * </p>
     * @author XQF SUI
     * @created 2016年11月2日 下午2:09:04
     * @return
     */
    public static int getMonthDays(Date date) {  
          
        Calendar c = Calendar.getInstance();  
        
        c.setTime(date);
        c.set(Calendar.DATE, 1);  
        c.roll(Calendar.DATE, -1);  

        return c.get(Calendar.DATE); 
    }
    
    /**
     * <p>
     * Desc: 获取当前月份
     * </p>
     * @author XQF SUI
     * @created 2017年9月27日 下午6:59:13
     * @return
     */
    public static int getNowMonth() {
        Calendar c = Calendar.getInstance();  
        return c.get(Calendar.MONTH) + 1;
    }
    
    /**
     * <p>
     * Desc: 获取距明天的秒数
     * </p>
     * @author XQF SUI
     * @created 2017年9月27日 下午8:14:49
     * @return
     */
    public static Long getNextDayIntervalSecond() {
    	return getIntervalSecond(getNow(), getDayFirstTime(getAfterDay(getNow(), 1)));
    }
    
    /**
     * <p>
     * Desc: 获取昨天时间
     * </p>
     *
     * @author XQF SUI
     * @created 2018年11月19日 下午4:06:01
     * @return
     */
    public static Date getYesterday() {
    	return getAfterDay(getNow(), -1);
    }
    
    /**
     * <p>
     * Desc:将日期格式字符串转换为时间格式
     * </p>
     * @author XQF SUI
     * @created: 2016年4月3日 下午3:11:54
     * @param date 日期格式字符串
     * @return
     * @throws ParseException 
     */
    public static Date convertToDate(String date) {
        try {
            if (date.matches("\\d{14}")) {
                return initDateFormat(TIME_FORMAT_SHORT).parse(date);
            } else if (date.matches("\\d{8}")) {
                return initDateFormat(DATE_FORMAT_SHORT).parse(date);
            } else if (date.matches("\\d{6}")) {
                return initDateFormat(DATE_FORMAT_YEAR_MONTH_SHORT).parse(date);
            } else if (date.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}")) {
                return initDateFormat(TIME_FORMAT_NORMAL).parse(date);
            } else if (date.matches("\\d{1,2}/\\d{1,2}/\\d{4} \\d{1,2}:\\d{1,2}:\\d{1,2}")) {
                return initDateFormat(TIME_FORMAT_ENGLISH).parse(date);
            } else if (date.matches("\\d{4}年\\d{1,2}月\\d{1,2}日 \\d{1,2}时\\d{1,2}分\\d{1,2}秒")) {
                return initDateFormat(TIME_FORMAT_CHINA).parse(date);
            } else if (date.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
                return initDateFormat(DATE_FORMAT_NORMAL).parse(date);
            } else if (date.matches("\\d{1,2}/\\d{1,2}/\\d{4}")) {
                return initDateFormat(DATE_FORMAT_ENGLISH).parse(date);
            } else if (date.matches("\\d{4}年\\d{1,2}月\\d{1,2}日")) {
                return initDateFormat(DATE_FORMAT_CHINA).parse(date);
            } else if (date.matches("\\d{4}\\d{1,2}\\d{1,2}\\d{1,2}\\d{1,2}")) {
                return initDateFormat(DATE_FORMAT_MINUTE).parse(date);
            } else if (date.matches("\\d{4}-\\d{1,2}")) {
            	return initDateFormat(DATE_FORMAT_YEAR_MONTH).parse(date);
            } else if (date.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{1,3}")) {
            	return initDateFormat(TIME_FORMAT_LONG_S).parse(date);
            }
        } catch (ParseException e) {
            logger.error("Date or Time String is invalid.", e);
        }
        
        return null;
    }
    
    public static void main(String[] args) {
		System.out.println(getTimeNormalString(getYearLastTime(getNow())));
	}
}